package com.zh.note.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * 通知执行顺序
 * 测试结果：
 * 正常情况：
 * SpringVersion: 5.3.22	SpringBootVersion: 2.7.2
 * -----@Around环绕通知AAA
 * -----@Before前置通知
 *      PayServiceImpl微信支付业务逻辑：ff5fd4277d6f446ebce3b3a3c4adcf56
 * -----@AfterReturning返回通知
 * -----@After后置通知
 * -----@Around环绕通知BBB
 *
 * 异常情况：
 * SpringVersion: 5.3.22	SpringBootVersion: 2.7.2
 * -----@Around环绕通知AAA
 * -----@Before前置通知
 *       PayServiceImpl微信支付业务逻辑：6163a4bc9ee945ab9aeb6d16c1e0c184
 * -----@AfterThrowing异常通知
 * -----@After后置通知
 */
@Aspect
@Component
public class PayAspect {
    @Before("execution(public void com.zh.note.service.impl.PayServiceImpl.pay(..))")
    public void beforeNotify() {
        System.out.println("-----@Before前置通知");
    }

    @After("execution(public void com.zh.note.service.impl.PayServiceImpl.pay(..))")
    public void afterNotify() {
        System.out.println("-----@After后置通知");
    }

    @AfterReturning("execution(public void com.zh.note.service.impl.PayServiceImpl.pay(..))")
    public void afterReturningNotify() {
        System.out.println("-----@AfterReturning返回通知");
    }

    @AfterThrowing("execution(public void com.zh.note.service.impl.PayServiceImpl.pay(..))")
    public void afterThrowingNotify() {
        System.out.println("-----@AfterThrowing异常通知");
    }

    @Around("execution(public void com.zh.note.service.impl.PayServiceImpl.pay(..))")
    public Object aroundNotify(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        Object retValue = null;

        System.out.println("-----@Around环绕通知AAA");
        retValue = proceedingJoinPoint.proceed();//放行
        System.out.println("-----@Around环绕通知BBB");

        return retValue;
    }
}
